#include <iostream>
#include <vector>

using namespace std;

struct ListNode {
    int val;
    ListNode *next;
    ListNode() : val(0), next(nullptr) {}
    ListNode(int x) : val(x), next(nullptr) {}
    ListNode(int x, ListNode *next) : val(x), next(next) {}
};

class Solution {
  public:
    ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
        ListNode *head = nullptr, *tail = nullptr;
        int c = 0, sum = 0;
        while (l1 != nullptr || l2 != nullptr) {
            int n1 = (l1 != nullptr) ? l1->val : 0;
            int n2 = (l2 != nullptr) ? l2->val : 0;
            sum = n1 + n2 + c;
            if (head == nullptr) {
                head = tail = new ListNode(sum % 10, nullptr);
            } else {
                tail->next = new ListNode(sum % 10, nullptr);
                tail = tail->next;
            }
            c = sum / 10;
            if (l1 != nullptr) l1 = l1->next;
            if (l2 != nullptr) l2 = l2->next;
        }
        if (c) {
            tail->next = new ListNode(c, nullptr);
        }
        return head;
    }
};